package pe.edu.upc.e41a.javasoft.jsf;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.roo.addon.jsf.managedbean.RooJsfManagedBean;
import org.springframework.roo.addon.serializable.RooSerializable;
import pe.edu.upc.e41a.javasoft.domain.Aviso;
import pe.edu.upc.e41a.javasoft.domain.Usuario;
import pe.edu.upc.e41a.javasoft.service.AvisoService;
import pe.edu.upc.e41a.javasoft.service.UsuarioService;

@ManagedBean(name = "avisoBean")
@SessionScoped
@Configurable
@RooSerializable
@RooJsfManagedBean(entity = Aviso.class, beanName = "avisoBean")
public class AvisoBean implements Serializable {

	private static final long serialVersionUID = 1L;

	@Autowired
	AvisoService avisoService;

	@Autowired
	UsuarioService usuarioService;

	private String name = "Avisoes";

	private Aviso aviso;
	private Integer ubicacion;

	private List<Aviso> allAvisoes;

	private boolean dataVisible = false;

	private List<String> columns;

	private boolean createDialogVisible = false;

	private Usuario usuarioSession;

	@PostConstruct
	public void init() {
		columns = new ArrayList<String>();
		columns.add("titulo");
		columns.add("mensaje");
		columns.add("posicion");
		columns.add("fechaInicio");
		columns.add("fechaFin");
		/*
		//Mostrando el aviso de la portada cuando no se a logeado
		allAvisoes = avisoService.mostrarAvisos(new Date(), 1);
		System.out.println(allAvisoes.get(0).getMensaje());
		aviso = allAvisoes.get(0);
		*/
	}

	public String buscarAvisoPorFechayPosicion() {

		String mensaje = "";

		if (fijarPosicionSession()) {
			allAvisoes = avisoService.mostrarAvisos(new Date(), ubicacion);
			System.out.println(allAvisoes.get(0).getMensaje());
			aviso = allAvisoes.get(0);
			mensaje = aviso.getMensaje();
		}

		return null;
	}

	public String getName() {
		return name;
	}

	public List<String> getColumns() {
		return columns;
	}

	public List<Aviso> getAllAvisoes() {
		return allAvisoes;
	}

	public void setAllAvisoes(List<Aviso> allAvisoes) {
		this.allAvisoes = allAvisoes;
	}

	public String findAllAvisoes() {
		allAvisoes = avisoService.findAllAvisoes();
		dataVisible = !allAvisoes.isEmpty();
		return null;
	}

	public boolean isDataVisible() {
		return dataVisible;
	}

	public void setDataVisible(boolean dataVisible) {
		this.dataVisible = dataVisible;
	}

	public Aviso getAviso() {
		if (aviso == null) {
			aviso = new Aviso();
		}
		return aviso;
	}

	public void setAviso(Aviso aviso) {
		this.aviso = aviso;
	}

	public List<Usuario> completeUsuario(String query) {
		List<Usuario> suggestions = new ArrayList<Usuario>();
		for (Usuario usuario : usuarioService.findAllUsuarios()) {
			String usuarioStr = String.valueOf(usuario.getNombres() + " "
					+ usuario.getApellidoPaterno() + " "
					+ usuario.getApellidoMaterno() + " " + usuario.getSexo());
			if (usuarioStr.toLowerCase().startsWith(query.toLowerCase())) {
				suggestions.add(usuario);
			}
		}
		return suggestions;
	}

	public String onEdit() {
		return null;
	}

	public boolean isCreateDialogVisible() {
		return createDialogVisible;
	}

	public void setCreateDialogVisible(boolean createDialogVisible) {
		this.createDialogVisible = createDialogVisible;
	}

	public String displayList() {
		createDialogVisible = false;
		findAllAvisoes();
		return "aviso";
	}

	public String displayCreateDialog() {
		aviso = new Aviso();
		createDialogVisible = true;
		return "aviso";
	}

	public String persist() {
		fijarUsuarioSession();
		System.out.println("Registrar Aviso");
		String message = "";
		if (aviso.getCodigo() != null) {
			avisoService.updateAviso(aviso);
			message = "Successfully updated";
		} else {
			message = avisoService.registrarAviso(aviso);
		}

		if (message.equalsIgnoreCase("El aviso se registró exitosamente.")) {
			FacesMessage facesMessage = new FacesMessage(
					FacesMessage.SEVERITY_INFO, "SYSTEM", message);
			FacesContext.getCurrentInstance().addMessage(null, facesMessage);
			reset();

		} else {
			FacesMessage facesMessage = new FacesMessage(
					FacesMessage.SEVERITY_ERROR, "SYSTEM", message);
			FacesContext.getCurrentInstance().addMessage(null, facesMessage);
		}
		return findAllAvisoes();
	}

	public String delete() {
		avisoService.deleteAviso(aviso);
		FacesMessage facesMessage = new FacesMessage("Successfully deleted");
		FacesContext.getCurrentInstance().addMessage(null, facesMessage);
		reset();
		return findAllAvisoes();
	}

	public void reset() {
		aviso = null;
		createDialogVisible = false;
	}

	public Usuario getUsuarioSession() {
		return usuarioSession;
	}

	public void setUsuarioSession(Usuario usuarioSession) {
		this.usuarioSession = usuarioSession;
	}

	public void fijarUsuarioSession() {
		try {
			FacesContext context = FacesContext.getCurrentInstance();
			HttpSession session = (HttpSession) context.getExternalContext()
					.getSession(false);
			usuarioSession = ((Usuario) session.getAttribute("usuarioSession"));
			aviso.setUsuario(usuarioSession);
			System.out.println("El usuario en sessión es: " + usuarioSession.getUsuario());
			
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	public boolean fijarPosicionSession() {
		boolean estado = false;
		try {
			FacesContext context = FacesContext.getCurrentInstance();
			HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
			String demo = session.getAttribute("posicionSession").toString();
			ubicacion = Integer.parseInt(demo);
			System.out.println("POSICION : " + demo);

			if (ubicacion != null) {
				estado = true;
			}

		} catch (Exception ex) {
			ex.printStackTrace();
			estado = false;
		}
		return estado;
	}
}
